home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994 November: Tool Chest / Dev.CD Nov 94.toast / Tool Chest / !Interfaces / Universal Interfaces 2.0a1 / PInterfaces / MIDI.p < prev    next >
Encoding:
Text File  |  1994-07-17  |  10.7 KB  |  348 lines  |  [TEXT/MPS ]

  1. {
  2.      File:        MIDI.p
  3.  
  4.      Copyright:    © 1984-1994 by Apple Computer, Inc.
  5.                  All rights reserved.
  6.  
  7.      Version:    Universal Interfaces 2.0a1.  ETO #15, MPW prerelease.  Sunday, July 17, 1994. 
  8.  
  9.      Bugs?:        If you find a problem with this file, send the file and version
  10.                  information (from above) and the problem description to:
  11.  
  12.                      Internet:    apple.bugs@applelink.apple.com
  13.                      AppleLink:    APPLE.BUGS
  14.  
  15. }
  16.  
  17. {$IFC UNDEFINED UsingIncludes}
  18. {$SETC UsingIncludes := 0}
  19. {$ENDC}
  20.  
  21. {$IFC NOT UsingIncludes}
  22.  UNIT MIDI;
  23.  INTERFACE
  24. {$ENDC}
  25.  
  26. {$IFC UNDEFINED __MIDI__}
  27. {$SETC __MIDI__ := 1}
  28.  
  29. {$I+}
  30. {$SETC MIDIIncludes := UsingIncludes}
  31. {$SETC UsingIncludes := 1}
  32.  
  33.  
  34. {$IFC UNDEFINED __ERRORS__}
  35. {$I Errors.p}
  36. {$ENDC}
  37. {    ConditionalMacros.p                                            }
  38.  
  39. {$IFC UNDEFINED __TYPES__}
  40. {$I Types.p}
  41. {$ENDC}
  42.  
  43. {$PUSH}
  44. {$ALIGN MAC68K}
  45. {$LibExport+}
  46.  
  47. CONST
  48.     midiToolNum                    = 4;                            {tool number of MIDI Manager for SndDispVersion call}
  49.     midiMaxNameLen                = 31;                            {maximum number of characters in port and client names}
  50. { Time formats }
  51.     midiFormatMSec                = 0;                            {milliseconds}
  52.     midiFormatBeats                = 1;                            {beats}
  53.     midiFormat24fpsBit            = 2;                            {24 frames/sec.}
  54.     midiFormat25fpsBit            = 3;                            {25 frames/sec.}
  55.     midiFormat30fpsDBit            = 4;                            {30 frames/sec. drop-frame}
  56.     midiFormat30fpsBit            = 5;                            {30 frames/sec.}
  57.     midiFormat24fpsQF            = 6;                            {24 frames/sec. longInt format }
  58.     midiFormat25fpsQF            = 7;                            {25 frames/sec. longInt format }
  59.     midiFormat30fpsDQF            = 8;                            {30 frames/sec. drop-frame longInt format }
  60.     midiFormat30fpsQF            = 9;                            {30 frames/sec. longInt format }
  61.     midiInternalSync            = 0;                            {internal sync}
  62.     midiExternalSync            = 1;                            {external sync}
  63. { Port types}
  64.     midiPortTypeTime            = 0;                            {time port}
  65.     midiPortTypeInput            = 1;                            {input port}
  66.     midiPortTypeOutput            = 2;                            {output port}
  67.     midiPortTypeTimeInv            = 3;                            {invisible time port}
  68. { OffsetTimes  }
  69.     midiGetEverything            = $7FFFFFFF;                    {get all packets, regardless of time stamps}
  70.     midiGetNothing                = $80000000;                    {get no packets, regardless of time stamps}
  71.     midiGetCurrent                = $00000000;                    {get current packets only}
  72.  
  73. {    MIDI data and messages are passed in MIDIPacket records (see below).
  74.     The first byte of every MIDIPacket contains a set of flags
  75.    
  76.     bits 0-1    00 = new MIDIPacket, not continued
  77.                      01 = begining of continued MIDIPacket
  78.                      10 = end of continued MIDIPacket
  79.                      11 = continuation
  80.     bits 2-3     reserved
  81.   
  82.     bits 4-6      000 = packet contains MIDI data
  83.    
  84.                   001 = packet contains MIDI Manager message
  85.    
  86.     bit 7         0 = MIDIPacket has valid stamp
  87.                   1 = stamp with current clock 
  88. }
  89.     midiContMask                = $03;
  90.     midiNoCont                    = $00;
  91.     midiStartCont                = $01;
  92.     midiMidCont                    = $03;
  93.     midiEndCont                    = $02;
  94.     midiTypeMask                = $70;
  95.     midiMsgType                    = $00;
  96.     midiMgrType                    = $10;
  97.     midiTimeStampMask            = $80;
  98.     midiTimeStampCurrent        = $80;
  99.     midiTimeStampValid            = $00;
  100. {    MIDI Manager MIDIPacket command words (the first word in the data field
  101.     for midiMgrType messages) }
  102.     midiOverflowErr                = $0001;
  103.     midiSCCErr                    = $0002;
  104.     midiPacketErr                = $0003;
  105.     midiMaxErr                    = $00FF;                        {all command words less than this value  are error indicators}
  106. { Valid results to be returned by readHooks }
  107.     midiKeepPacket                = 0;
  108.     midiMorePacket                = 1;
  109.     midiNoMorePacket            = 2;
  110. {     Driver calls: }
  111.     midiOpenDriver                = 1;
  112.     midiCloseDriver                = 2;
  113.  
  114.  
  115. TYPE
  116.     MIDIPacket = PACKED RECORD
  117.         flags:                    UInt8;
  118.         len:                    UInt8;
  119.         tStamp:                    LONGINT;
  120.         data:                    ARRAY [0..248] OF UInt8;
  121.     END;
  122.     MIDIPacketPtr = ^MIDIPacket;
  123.  
  124.     MIDIClkInfo = RECORD
  125.         sync:                    INTEGER;                                {synchronization external/internal}
  126.         curTime:                LONGINT;                                {current value of port's clock}
  127.         format:                    INTEGER;                                {time code format}
  128.     END;
  129.     MIDIIDRec = RECORD
  130.         clientID:                OSType;
  131.         portID:                    OSType;
  132.     END;
  133.     MIDIPortInfo = RECORD
  134.         portType:                INTEGER;                                {type of port}
  135.         timeBase:                MIDIIDRec;                                {MIDIIDRec for time base}
  136.         numConnects:            INTEGER;                                {number of connections}
  137.         cList:                    ARRAY [0..0] OF MIDIIDRec;                {ARRAY [1..numConnects] of MIDIIDRec}
  138.     END;
  139.     MIDIPortInfoPtr = ^MIDIPortInfo;
  140.     MIDIPortInfoHdl = ^MIDIPortInfoPtr;
  141.     MIDIPortInfoHandle = ^MIDIPortInfoPtr;
  142.  
  143.     MIDIPortParams = RECORD
  144.         portID:                    OSType;                                    {ID of port, unique within client}
  145.         portType:                INTEGER;                                {Type of port - input, output, time, etc.}
  146.         timeBase:                INTEGER;                                {refnum of time base, 0 if none}
  147.         offsetTime:                LONGINT;                                {offset for current time stamps}
  148.         readHook:                Ptr;                                    {routine to call when input data is valid}
  149.         refCon:                    LONGINT;                                {refcon for port (for client use)}
  150.         initClock:                MIDIClkInfo;                            {initial settings for a time base}
  151.         name:                    Str255;                                    {name of the port, This is a real live string, not a ptr.}
  152.     END;
  153.     MIDIPortParamsPtr = ^MIDIPortParams;
  154.  
  155.     MIDIIDList = RECORD
  156.         numIDs:                    INTEGER;
  157.         list:                    ARRAY [0..0] OF OSType;
  158.     END;
  159.     MIDIIDListPtr = ^MIDIIDList;
  160.     MIDIIDListHdl = ^MIDIIDListPtr;
  161.     MIDIIDListHandle = ^MIDIIDListPtr;
  162.  
  163.     
  164.          Prototype Declarations for readHook and timeProc
  165.         
  166.          extern pascal short myReadHook(MIDIPacketPtr myPacket, long myRefCon);
  167.          extern pascal void myTimeProc(long curTime, long myRefCon);
  168.         
  169.          MIDI Manager Routines
  170. }
  171.  
  172. FUNCTION MIDIVersion: NumVersion;
  173.     {$IFC NOT GENERATINGCFM}
  174.     INLINE $203C, $0000, 4, $A800;
  175.     {$ENDC}
  176. FUNCTION MIDISignIn(clientID: OSType; refCon: LONGINT; icon: Handle; name: ConstStr255Param): OSErr;
  177.     {$IFC NOT GENERATINGCFM}
  178.     INLINE $203C, $0004, 4, $A800;
  179.     {$ENDC}
  180. PROCEDURE MIDISignOut(clientID: OSType);
  181.     {$IFC NOT GENERATINGCFM}
  182.     INLINE $203C, $0008, 4, $A800;
  183.     {$ENDC}
  184. FUNCTION MIDIGetClients: MIDIIDListHandle;
  185.     {$IFC NOT GENERATINGCFM}
  186.     INLINE $203C, $000C, 4, $A800;
  187.     {$ENDC}
  188. PROCEDURE MIDIGetClientName(clientID: OSType; VAR name: Str255);
  189.     {$IFC NOT GENERATINGCFM}
  190.     INLINE $203C, $0010, 4, $A800;
  191.     {$ENDC}
  192. PROCEDURE MIDISetClientName(clientID: OSType; name: ConstStr255Param);
  193.     {$IFC NOT GENERATINGCFM}
  194.     INLINE $203C, $0014, 4, $A800;
  195.     {$ENDC}
  196. FUNCTION MIDIGetPorts(clientID: OSType): MIDIIDListHandle;
  197.     {$IFC NOT GENERATINGCFM}
  198.     INLINE $203C, $0018, 4, $A800;
  199.     {$ENDC}
  200. FUNCTION MIDIAddPort(clientID: OSType; BufSize: INTEGER; VAR refnum: INTEGER; init: MIDIPortParamsPtr): OSErr;
  201.     {$IFC NOT GENERATINGCFM}
  202.     INLINE $203C, $001C, 4, $A800;
  203.     {$ENDC}
  204. FUNCTION MIDIGetPortInfo(clientID: OSType; portID: OSType): MIDIPortInfoHandle;
  205.     {$IFC NOT GENERATINGCFM}
  206.     INLINE $203C, $0020, 4, $A800;
  207.     {$ENDC}
  208. FUNCTION MIDIConnectData(srcClID: OSType; srcPortID: OSType; dstClID: OSType; dstPortID: OSType): OSErr;
  209.     {$IFC NOT GENERATINGCFM}
  210.     INLINE $203C, $0024, 4, $A800;
  211.     {$ENDC}
  212. FUNCTION MIDIUnConnectData(srcClID: OSType; srcPortID: OSType; dstClID: OSType; dstPortID: OSType): OSErr;
  213.     {$IFC NOT GENERATINGCFM}
  214.     INLINE $203C, $0028, 4, $A800;
  215.     {$ENDC}
  216. FUNCTION MIDIConnectTime(srcClID: OSType; srcPortID: OSType; dstClID: OSType; dstPortID: OSType): OSErr;
  217.     {$IFC NOT GENERATINGCFM}
  218.     INLINE $203C, $002C, 4, $A800;
  219.     {$ENDC}
  220. FUNCTION MIDIUnConnectTime(srcClID: OSType; srcPortID: OSType; dstClID: OSType; dstPortID: OSType): OSErr;
  221.     {$IFC NOT GENERATINGCFM}
  222.     INLINE $203C, $0030, 4, $A800;
  223.     {$ENDC}
  224. PROCEDURE MIDIFlush(refnum: INTEGER);
  225.     {$IFC NOT GENERATINGCFM}
  226.     INLINE $203C, $0034, 4, $A800;
  227.     {$ENDC}
  228. FUNCTION MIDIGetReadHook(refnum: INTEGER): ProcPtr;
  229.     {$IFC NOT GENERATINGCFM}
  230.     INLINE $203C, $0038, 4, $A800;
  231.     {$ENDC}
  232. PROCEDURE MIDISetReadHook(refnum: INTEGER; hook: ProcPtr);
  233.     {$IFC NOT GENERATINGCFM}
  234.     INLINE $203C, $003C, 4, $A800;
  235.     {$ENDC}
  236. PROCEDURE MIDIGetPortName(clientID: OSType; portID: OSType; VAR name: Str255);
  237.     {$IFC NOT GENERATINGCFM}
  238.     INLINE $203C, $0040, 4, $A800;
  239.     {$ENDC}
  240. PROCEDURE MIDISetPortName(clientID: OSType; portID: OSType; name: ConstStr255Param);
  241.     {$IFC NOT GENERATINGCFM}
  242.     INLINE $203C, $0044, 4, $A800;
  243.     {$ENDC}
  244. PROCEDURE MIDIWakeUp(refnum: INTEGER; time: LONGINT; period: LONGINT; timeProc: ProcPtr);
  245.     {$IFC NOT GENERATINGCFM}
  246.     INLINE $203C, $0048, 4, $A800;
  247.     {$ENDC}
  248. PROCEDURE MIDIRemovePort(refnum: INTEGER);
  249.     {$IFC NOT GENERATINGCFM}
  250.     INLINE $203C, $004C, 4, $A800;
  251.     {$ENDC}
  252. FUNCTION MIDIGetSync(refnum: INTEGER): INTEGER;
  253.     {$IFC NOT GENERATINGCFM}
  254.     INLINE $203C, $0050, 4, $A800;
  255.     {$ENDC}
  256. PROCEDURE MIDISetSync(refnum: INTEGER; sync: INTEGER);
  257.     {$IFC NOT GENERATINGCFM}
  258.     INLINE $203C, $0054, 4, $A800;
  259.     {$ENDC}
  260. FUNCTION MIDIGetCurTime(refnum: INTEGER): LONGINT;
  261.     {$IFC NOT GENERATINGCFM}
  262.     INLINE $203C, $0058, 4, $A800;
  263.     {$ENDC}
  264. PROCEDURE MIDISetCurTime(refnum: INTEGER; time: LONGINT);
  265.     {$IFC NOT GENERATINGCFM}
  266.     INLINE $203C, $005C, 4, $A800;
  267.     {$ENDC}
  268. PROCEDURE MIDIStartTime(refnum: INTEGER);
  269.     {$IFC NOT GENERATINGCFM}
  270.     INLINE $203C, $0060, 4, $A800;
  271.     {$ENDC}
  272. PROCEDURE MIDIStopTime(refnum: INTEGER);
  273.     {$IFC NOT GENERATINGCFM}
  274.     INLINE $203C, $0064, 4, $A800;
  275.     {$ENDC}
  276. PROCEDURE MIDIPoll(refnum: INTEGER; offsetTime: LONGINT);
  277.     {$IFC NOT GENERATINGCFM}
  278.     INLINE $203C, $0068, 4, $A800;
  279.     {$ENDC}
  280. FUNCTION MIDIWritePacket(refnum: INTEGER; packet: MIDIPacketPtr): OSErr;
  281.     {$IFC NOT GENERATINGCFM}
  282.     INLINE $203C, $006C, 4, $A800;
  283.     {$ENDC}
  284. FUNCTION MIDIWorldChanged(clientID: OSType): BOOLEAN;
  285.     {$IFC NOT GENERATINGCFM}
  286.     INLINE $203C, $0070, 4, $A800;
  287.     {$ENDC}
  288. FUNCTION MIDIGetOffsetTime(refnum: INTEGER): LONGINT;
  289.     {$IFC NOT GENERATINGCFM}
  290.     INLINE $203C, $0074, 4, $A800;
  291.     {$ENDC}
  292. PROCEDURE MIDISetOffsetTime(refnum: INTEGER; offsetTime: LONGINT);
  293.     {$IFC NOT GENERATINGCFM}
  294.     INLINE $203C, $0078, 4, $A800;
  295.     {$ENDC}
  296. FUNCTION MIDIConvertTime(srcFormat: INTEGER; dstFormat: INTEGER; time: LONGINT): LONGINT;
  297.     {$IFC NOT GENERATINGCFM}
  298.     INLINE $203C, $007C, 4, $A800;
  299.     {$ENDC}
  300. FUNCTION MIDIGetRefCon(refnum: INTEGER): LONGINT;
  301.     {$IFC NOT GENERATINGCFM}
  302.     INLINE $203C, $0080, 4, $A800;
  303.     {$ENDC}
  304. PROCEDURE MIDISetRefCon(refnum: INTEGER; refCon: LONGINT);
  305.     {$IFC NOT GENERATINGCFM}
  306.     INLINE $203C, $0084, 4, $A800;
  307.     {$ENDC}
  308. FUNCTION MIDIGetClRefCon(clientID: OSType): LONGINT;
  309.     {$IFC NOT GENERATINGCFM}
  310.     INLINE $203C, $0088, 4, $A800;
  311.     {$ENDC}
  312. PROCEDURE MIDISetClRefCon(clientID: OSType; refCon: LONGINT);
  313.     {$IFC NOT GENERATINGCFM}
  314.     INLINE $203C, $008C, 4, $A800;
  315.     {$ENDC}
  316. FUNCTION MIDIGetTCFormat(refnum: INTEGER): INTEGER;
  317.     {$IFC NOT GENERATINGCFM}
  318.     INLINE $203C, $0090, 4, $A800;
  319.     {$ENDC}
  320. PROCEDURE MIDISetTCFormat(refnum: INTEGER; format: INTEGER);
  321.     {$IFC NOT GENERATINGCFM}
  322.     INLINE $203C, $0094, 4, $A800;
  323.     {$ENDC}
  324. PROCEDURE MIDISetRunRate(refnum: INTEGER; rate: INTEGER; time: LONGINT);
  325.     {$IFC NOT GENERATINGCFM}
  326.     INLINE $203C, $0098, 4, $A800;
  327.     {$ENDC}
  328. FUNCTION MIDIGetClientIcon(clientID: OSType): Handle;
  329.     {$IFC NOT GENERATINGCFM}
  330.     INLINE $203C, $009C, 4, $A800;
  331.     {$ENDC}
  332. FUNCTION SndDispVersion(toolnum: INTEGER): LONGINT;
  333.     {$IFC NOT GENERATINGCFM}
  334.     INLINE $203C, $0000, $0000, $A800;
  335.     {$ENDC}
  336.  
  337. {$ALIGN RESET}
  338. {$POP}
  339.  
  340. {$SETC UsingIncludes := MIDIIncludes}
  341.  
  342. {$ENDC} {__MIDI__}
  343.  
  344. {$IFC NOT UsingIncludes}
  345.  END.
  346. {$ENDC}
  347.